/* 
功能1：获取收货地址
  1 绑定监听
  2 查看收货地址API chooseAddress
  3 获取收货地址权限状态  getSetting
    1 如果点击确认 scope.address=true 获取地址
    2 如果没有点击过 scope undefined  获取地址
    3 如果点击取消 scope.address=false
      1 引导用户打开授权页面 
      2 获取地址
功能2：显示地址 onShow
    1 获取本地缓存地址数据
    2 给data中的变量赋值
功能3：显示购物车数据 onshow
    1 获取缓存中的cart数据
    2 保存到data数据中
    3 标签中遍历显示cart数据
功能4：商品总价格和总数量
    1 获取购物车数组
    2 判断商品是否被选中
    3 求总数量和总价格并返回给data
功能5：商品选中
    1 绑定change事件
    2 获取被修改的商品对象
    3 商品对象的选中状态取反
    4 重新将对象数据填入data和缓存
    5 重新计算总价格、总数量。。。
功能6：全选和反选
    1 绑定change事件
    2 获取data中allChecked并取反
    3 遍历购物车数组，将选中状态随allChecked变化
    4 重新将购物车数据和allChecked填入data和缓存
    5 重新计算总价格、总数量。。。
功能7：商品编辑
    1 绑定点击事件
    2 自定义属性 传递点击商品的id
    3 当 购物车num=1 且 点击“-1”
      弹出提示是否删除
    4 修改id对应商品的num
    5 重新赋值到缓存和data中 setCart

*/

import { chooseAddress, getSetting, openSetting, showModal, showToast } from "../../utils/asyncWX";
Page({
  data:{
    address:{},
    cart:[],
    allChecked:false,
    totalNum:0,
    totalPrice:0
  },

  onShow(){
    // 1 获取本地缓存数据
    const address=wx.getStorageSync('address');
    const cart=wx.getStorageSync('cart')||[];
    this.setData({address});
    this.setCart(cart);    
  },

  // 获取收货地址
  async handleChooseAddress(){
    /* 优化后 */
    try {
      // 1 获取权限状态
      const res1=await getSetting();
      const scopeAddress=res1.authSetting["scope.address"];
      // 2 判断权限状态
      if(scopeAddress===false){
        // 3 引导用户打开授权页面  
        await openSetting();
      }
      // 4 获取地址数据
      let address=await chooseAddress();
      address.all=address.provinceName+address.cityName+address.countyName+address.detailInfo;
      // 5 存入缓存中
      wx.setStorageSync('address', address);
    } catch (error) {
      console.log(error);
    }

    /* 优化前 */
    // wx.getSetting({
    //   success: (result) => {
    //   // 提取权限状态 只要不是一般属性名都用 [""] 的形式
    //   const scopeAddress=result.authSetting["scope.address"];
    //   if(scopeAddress===true||scopeAddress===undefined){
    //     wx.chooseAddress({
    //       success: (result1) => {
    //         console.log(result1);
    //       }
    //     });
    //   }else{
    //     // 引导用户打开授权页面  
    //     wx.openSetting({
    //       success:(result2)=>{
    //         // 调用收货地址代码
    //         wx.chooseAddress({
    //           success: (result1) => {
    //             console.log(result1);
    //           }
    //         });
    //       }
    //     })
    //   }
    //   }
    // })
  },

  // 商品选中
  handleItemChange(e){
    //1 获取商品id
    const goods_id=e.currentTarget.dataset.id;
    //2 获取购物车数组
    let {cart}=this.data;
    //3 找到对应索引
    let index=cart.findIndex(v=>v.goods_id===goods_id);
    //4 选中状态取反
    cart[index].checked=!cart[index].checked;
    // 重新计算总价格和总数量
    this.setCart(cart);
  },

  // 设置购物车 重新计算价格和数量
  setCart(cart){
    // 计算是否全选
    // 注：当空数组调用every 返回也为true
    // const allChecked=cart.length?cart.every(v=>v.checked):false;
    let allChecked=true;
    let totalNum=0;
    let totalPrice=0;
    cart.forEach(v => {
      if(v.checked){
        // 如果被选中 总数+num 总价+num*price
        totalNum += v.num;
        totalPrice += v.num * v.goods_price;
      }else{
        allChecked=false;
      }
    });
    cart.length?allChecked:allChecked=false;
    // 赋值给data
    this.setData({
      cart,
      allChecked,
      totalNum,
      totalPrice
    });
    wx.setStorageSync('cart',cart);
  },

  // 全选按钮
  handleItemAllCheck(){
    //1 获取allChecked并取反
    let {cart,allChecked}=this.data;
    allChecked=!allChecked;
    //2 循环商品状态
    cart.forEach(v=>v.checked=allChecked)
    //3 重新填入data和缓存
    this.setCart(cart);
  },

  // 商品编辑
  async handleItemNumEdit(e){
    const {id,operation}=e.currentTarget.dataset;
    // 修改商品num
    let {cart}=this.data;
    const index=cart.findIndex(v=>v.goods_id===id); 
    if(cart[index].num===1&&operation===-1){
      // 弹出提示
      const res=await showModal({content:"您是否要删除？"});
      if (res.confirm) {
        // 执行删除
        cart.splice(index,1);
        this.setCart(cart);
      }else if(res.cancel){
        console.log("取消")
      }   
    }else{
      cart[index].num+=operation;
      this.setCart(cart);
    }
  },

  // 结算
  async handlePay(){
    //1 判断是否有地址数据
    const {address,totalNum}=this.data;
    if(!address.userName){
      await showToast({title:"您还没有选择收货地址"});
      return;
    }    
    //2 判断是否有商品数据
    if(totalNum===0){
      await showToast({title:"您还没有选购商品"});
      return;
    }
    //3 跳转到支付页面
    wx.navigateTo({
      url: '/pages/pay/index'
    });
      
  }

})